home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 050 / thelp30.arc / THELP30.PAS < prev   
Pascal/Delphi Source File  |  1986-03-25  |  35KB  |  903 lines

  1. PROGRAM THELP;
  2.  
  3. {$C-}
  4. {$K-}
  5.  
  6. { Version 3.0 contains the following enhancements:
  7.    Added the new features for 3.0 obviously and
  8.    Fixed the windowing routines to speed them up.
  9.    Added 11/30/85 by J.L.Dove III                    }
  10.  
  11.  
  12. {VARIABLE SECTION FOR 'THELP'}
  13.  
  14. type
  15.   text80          = string[80];
  16.   RegType         = record
  17.                       ax,bx,cx,dx,bp,si,di,ds,es,flags:integer
  18.                     end;
  19.   HalfRegType     = record
  20.                       al,ah,bl,bh,cl,ch,dl,dh:byte
  21.                     end;
  22.   IntrType        = record
  23.                       ip,cs : integer
  24.                     end;
  25.  
  26.   Screen = array [1..$1000] of byte;
  27.  
  28. const
  29.   EntryChar       = 19;                { ALT 'R' }
  30.   Escape          = 0;
  31.   FirstRow        = 3;
  32.   FirstCol        = 11;
  33.   WindowWidth     = 60;
  34.   WindowLength    = 18;
  35.   Dr              = 3;
  36.   Mr              = 12;
  37.   Cr              = $0D;
  38.   UserInt         = $66;                  { ***HERE IT IS*** }
  39.                                           {if thelp will not work with your other
  40.                                            resident stuff, change this number to
  41.                                            a free interrupt}
  42.   KybdInt         = $16;
  43.   ProgSize : integer = $A000;             { approx. program size }
  44.  
  45.   Regs    : regtype = (ax:0;bx:0;cx:0;dx:0;bp:0;si:0;di:0;ds:0;es:0;flags:0);
  46.   SaveDS  :integer  = 0;
  47.  
  48. var
  49.   Answer,
  50.   Garbage : char;
  51.   RealScreen : Screen absolute $B800:$0000;
  52.   TempScreen : Screen;
  53.   SaveReg    : RegType;
  54.   SaveHalf   : HalfRegType absolute SaveReg;
  55.   HalfReg    : HalfRegType absolute regs;
  56.   i,j,x,y    : integer;
  57.   CursorPos  : integer;
  58.   Selection  : integer;
  59.   savebuf    : array[1..windowwidth] of array[1..windowlength] of integer;
  60.  
  61.  
  62. { MISC. PROCEDURES AND FUNTIONS FOR THELP }
  63.  
  64. procedure Bright(line:text80);
  65. begin
  66.   textcolor(15);
  67.   write(line);
  68.   textcolor(7);
  69. end;
  70.  
  71. procedure PrintHeading;
  72. begin
  73.   bright('T');       write('URBO Pascal ');
  74.   bright('Help   ');  write('Ver 3.0');
  75. end;
  76.  
  77. procedure PrintMCS;
  78. begin
  79.   bright('M'); write('agnum ');
  80.   bright('C'); write('ustom ');
  81.   bright('S'); writeln('oftware');
  82.   write('             (Enhancements added by JLD III)');
  83. end;
  84.  
  85. procedure Border;
  86. begin
  87.    GotoXY(1,1);                              {clear the window now}
  88.    Write(chr(218));
  89.    for i:=2 to windowwidth-1 do Write(chr(196));
  90.    Write(chr(191));
  91.    for i:=2 to windowlength-1 do
  92.    begin
  93.       GotoXY(1, i);  Write(chr(179));
  94. (*      for j := 2 to windowwidth-1 do
  95.          Write(' ');   *)
  96.       GotoXY(windowwidth, i);  Write(chr(179));
  97.    end;
  98.    GotoXY(1, windowlength);
  99.    Write(chr(192));
  100.    for i:=2 to windowwidth-1 do Write(chr(196));
  101.    Write(chr(217));
  102. END;
  103.  
  104. function GetScreenChar:integer;
  105. begin
  106.    savereg.ax := $0800;                 {9 -> get character/attr @ cursor}
  107.    savereg.bx := 0;
  108.    Intr($10,savereg);
  109.    GetScreenChar := savereg.ax
  110. end;
  111.  
  112. procedure PutScreenChar(input:integer);
  113. begin
  114.    savereg.ax := $0900 + (input and $FF); {a -> put character/attr @ cursor}
  115.    savereg.bx := input shr 8;          {put the attrib in bl and 0 in bh}
  116.    savereg.cx := 1;
  117.    Intr($10,savereg)
  118. end;
  119.  
  120. procedure OpenWindow;
  121. begin
  122.   window (firstcol, firstrow, firstcol+windowwidth, firstrow+windowlength);
  123. (*    for j := 1 to windowlength do
  124.       for i := 1 to windowwidth do
  125.       begin
  126.          GoToXY(i,j);
  127.          savebuf[i][j] := GetScreenChar      {get a attribute/character at the cursor}
  128.       end;
  129. *)
  130.    border;
  131.   window(firstcol+1,firstrow+1,firstcol+windowwidth-2,firstrow+windowlength-2);
  132.   ClrScr;
  133. end;
  134.  
  135. procedure closewindow;
  136. begin
  137.   window (firstcol, firstrow, firstcol+windowwidth, firstrow+windowlength);
  138. (*  for j := 1 to windowlength do
  139.     for i := 1 to windowwidth do
  140.       begin
  141.          GoToXY(i,j);
  142.          PutScreenChar(savebuf[i][j])
  143.       end
  144. *)
  145. end;
  146.  
  147.  
  148. { MENU PRINT PROCEDURES FOR THELP }
  149.  
  150. procedure PrintMenu(number:integer);
  151. begin
  152.   case number of
  153.     0  : begin
  154.            gotoxy(mr+3,1);  PrintHeading;
  155.            gotoxy(mr+6,2);  PrintMCS;
  156.            gotoxy(mr+12,4); write('MAIN MENU');
  157.            gotoxy(mr,5);  write('<1> Edit Commands');
  158.            gotoxy(mr,6);  write('<2> Syntax Structure');
  159.            gotoxy(mr,7);  write('<3> Standard Procedures/Functions');
  160.            gotoxy(mr,8);  write('<4> Compiler Directives');
  161.            gotoxy(mr,9);  write('<5> Runtime Errors');
  162.            gotoxy(mr,10); write('<6> I/O Errors');
  163.            gotoxy(mr,11); write('<7> Standard Identifiers');
  164.            gotoxy(mr,12); write('<8> Version 2 Additions');
  165.            gotoxy(mr,13); write('<9> Version 3 Additions');
  166.            gotoxy(mr,16); write('Enter Selection  (<ESC> to Exit)  ');
  167.          end;
  168.     1  : begin
  169.            gotoxy(mr+3,2);   PrintHeading;
  170.            gotoxy(mr+6,3);   PrintMCS;
  171.            gotoxy(mr+7,5);   write('EDITOR COMMANDS MENU');
  172.            gotoxy(mr,7);   write('<1> Cursor Movements Part I');
  173.            gotoxy(mr,8);   write('<2> Cursor Movements Part II');
  174.            gotoxy(mr,9);   write('<3> Insert and Delete Commands');
  175.            gotoxy(mr,10);  write('<4> Block Commands');
  176.            gotoxy(mr,11);  write('<5> Miscellaneous and Options');
  177.            gotoxy(mr,16);write('Enter Selection (<ESC> for Main Menu)  ');
  178.          end;
  179.  
  180.     2  : begin
  181.            gotoxy(mr+3,2);   PrintHeading;
  182.            gotoxy(mr+6,3);   PrintMCS;
  183.            gotoxy(mr+6,5);   write('SYNTAX STRUCTURE MENU');
  184.            gotoxy(mr,6);   write('<1> TYPE');
  185.            gotoxy(mr,7);   write('<2> CONST');
  186.            gotoxy(mr,8);   write('<3> VAR');
  187.            gotoxy(mr,9);   write('<4> WITH DO and CASE');
  188.            gotoxy(mr,10);  write('<5> REPEAT UNTIL and WHILE DO');
  189.            gotoxy(mr,11);  write('<6> IF THEN ELSE and FOR TO DO');
  190.            gotoxy(mr,12);  write('<7> PROGRAM, PROCEDURE and FUNCTION');
  191.            gotoxy(mr,13);  write('<8> Program Structure');
  192.            gotoxy(mr,16);write('Enter Selection (<ESC> for Main Menu)  ');
  193.          end;
  194.  
  195.     3  : begin
  196.            gotoxy(mr+3,2);   PrintHeading;
  197.            gotoxy(mr+6,3);   PrintMCS;
  198.            gotoxy(mr,5);   write('STANDARD PROCEDURES/FUNCTIONS MENU');
  199.            gotoxy(mr,6);   write('<1> Input/Output Procedures');
  200.            gotoxy(mr,7);   write('<2> Arithmetic Functions');
  201.            gotoxy(mr,8);   write('<3> Scalar Functions/Heap Control');
  202.            gotoxy(mr,9);   write('<4> String Procedures and Functions');
  203.            gotoxy(mr,10);  write('<5> File Handling Procedures');
  204.            gotoxy(mr,11);  write('<6> File Handling Functions');
  205.            gotoxy(mr,12);  write('<7> Transfer/Screen Procs & Funcs');
  206.            gotoxy(mr,13);  write('<8> Miscellaneous Proc/Func Part I');
  207.            gotoxy(mr,14);  write('<9> Miscellaneous Functions Part II');
  208.            gotoxy(mr-1,16);  write('Enter Selection (<ESC> for Main Menu)  ');
  209.          end;
  210.   end;
  211.   repeat
  212.     savereg.ax := $00;
  213.     Intr(userint,savereg);
  214.     selection := savehalf.ah - 1;
  215.   until ((selection in [0..9]) and (number in [0,3]))
  216.      or ((selection in [0..5]) and (number = 1))
  217.      or ((selection in [0..8]) and (number = 2));
  218.   clrscr;
  219. end;
  220.  
  221.  
  222. procedure Wait;
  223. begin
  224.   gotoxy(14,16); write('PRESS <ESC> TO RETURN TO MENU');
  225.   repeat
  226.     savereg.ax := 0;
  227.     Intr(userint,savereg);
  228.   until savehalf.ah = $01;
  229.   clrscr;
  230. end;
  231.  
  232. procedure CursorMoveI;
  233. begin
  234.   gotoxy(dr,2);   write('CURSOR MOVEMENTS  Part I :');
  235.   gotoxy(dr,4);   write('  Character left         Ctrl-S  ->   ',#$1B);
  236.   gotoxy(dr,5);   write('    Alternative          Ctrl-H  ->  ');
  237.   gotoxy(dr,6);   write('  Character right        Ctrl-D  ->   ',#$1A);
  238.   gotoxy(dr,7);   write('  Word left              Ctrl-A  ->  Ctrl ',#$1B);
  239.   gotoxy(dr,8);   write('  Word right             Ctrl-F  ->  Ctrl ',#$1A);
  240.   gotoxy(dr,9);   write('  Line up                Ctrl-E  ->   ',#$18);
  241.   gotoxy(dr,10);  write('  Line down              Ctrl-X  ->   ',#$19);
  242.   gotoxy(dr,11);  write('  Scroll up              Ctrl-W  ->  ');
  243.   gotoxy(dr,12);  write('  Scroll down            Ctrl-Z  ->  ');
  244.   gotoxy(dr,13);  write('  Page up                Ctrl-R  ->  PgUp');
  245.   gotoxy(dr,14);  write('  Page down              Ctrl-C  ->  PgDn');
  246.   Wait;
  247. end;
  248.  
  249. procedure CursorMoveII;
  250. begin
  251.   gotoxy(dr,2);   write('CURSOR MOVEMENTS  Part II :');
  252.   gotoxy(dr,4);   write('  To left on line      Ctrl-Q Ctrl-S  ->  Home');
  253.   gotoxy(dr,5);   write('  To right on line     Ctrl-Q Ctrl-D  ->  End');
  254.   gotoxy(dr,6);   write('  To top of page       Ctrl-Q Ctrl-E  ->  Ctrl Home');
  255.   gotoxy(dr,7);   write('  To bottom of page    Ctrl-Q Ctrl-X  ->  Ctrl End');
  256.   gotoxy(dr,8);   write('  To top of file       Ctrl-Q Ctrl-R  ->  Ctrl PgUp');
  257.   gotoxy(dr,9);   write('  To end of file       Ctrl-Q Ctrl-C  ->  Ctrl PgDn');
  258.   gotoxy(dr,10);  write('  To top of block      Ctrl-Q Ctrl-B  ->  ');
  259.   gotoxy(dr,11);  write('  To end of block      Ctrl-Q Ctrl-K  ->  ');
  260.   gotoxy(dr,12);  write('  To last cur.pos.     Ctrl-Q Ctrl-P  ->  ');
  261.   Wait;
  262. end;
  263.  
  264. procedure InsertDelete;
  265. begin
  266.   gotoxy(dr,2);   write('INSERT and DELETE :');
  267.   gotoxy(dr,4);   write('  Insert mode on/off     Ctrl-V         ->  Ins');
  268.   gotoxy(dr,5);   write('  Insert line            Ctrl-N         ->  ');
  269.   gotoxy(dr,6);   write('  Delete line            Ctrl-Y         ->  ');
  270.   gotoxy(dr,7);   write('  Del to end of line     Ctrl-Q Ctrl-Y  ->  ');
  271.   gotoxy(dr,8);   write('  Delete right word      Ctrl-T         ->  ');
  272.   gotoxy(dr,9);   write('  Del char under cursor  Ctrl-G         ->  Del');
  273.   gotoxy(dr,10);  write('  Delete left character  <DEL>          ->  ');
  274.   gotoxy(dr,11);  write('    Alternative          nothing        ->  ');
  275.   Wait;
  276. end;
  277.  
  278. procedure BlockCommands;
  279. begin
  280.   gotoxy(dr,2);   write('BLOCK COMMANDS :');
  281.   gotoxy(dr,4);   write('  Mark block begin       Ctrl-K Ctrl-B  ->  F7');
  282.   gotoxy(dr,5);   write('  Mark block end         Ctrl-K Ctrl-K  ->  F8');
  283.   gotoxy(dr,6);   write('  Mark single word       Ctrl-K Ctrl-T  ->  ');
  284.   gotoxy(dr,7);   write('  Hide/display block     Ctrl-K Ctrl-H  ->  ');
  285.   gotoxy(dr,8);   write('  Copy block             Ctrl-K Ctrl-C  ->  ');
  286.   gotoxy(dr,9);   write('  Move block             Ctrl-K Ctrl-V  ->  ');
  287.   gotoxy(dr,10);  write('  Delete block           Ctrl-K Ctrl-Y  ->  ');
  288.   gotoxy(dr,11);  write('  Read block from disk   Ctrl-K Ctrl-R  ->  ');
  289.   gotoxy(dr,12);  write('  Write block to disk    Ctrl-K Ctrl-W  ->  ');
  290.   Wait;
  291. end;
  292.  
  293. procedure MiscEditing;
  294. begin
  295.   gotoxy(dr,1);   write('MISC. EDITING COMMANDS :');
  296.   gotoxy(dr,2);   write('  End edit               Ctrl-K Ctrl-D  ->  ');
  297.   gotoxy(dr,3);   write('  Tab                    Ctrl-I         ->  Tab');
  298.   gotoxy(dr,4);   write('  Auto tab on/off        Ctrl-Q Ctrl-I  ->  ');
  299.   gotoxy(dr,5);   write('  Restore line           Ctrl-Q Ctrl-L  ->  ');
  300.   gotoxy(dr,6);   write('  Find                   Ctrl-Q Ctrl-F  ->  ');
  301.   gotoxy(dr,7);   write('  Find and Replace       Ctrl-Q Ctrl-A  ->  ');
  302.   gotoxy(dr,8);   write('  Repeat last find       Ctrl-L         ->  ');
  303.   gotoxy(dr,9);   write('  Control char prefix    Ctrl-P         ->  ');
  304.   gotoxy(dr,10);  write('  Abort operation        Ctrl-U         ->  ');
  305.   gotoxy(dr,11);  write('OPTIONS :');
  306.   gotoxy(dr,12);  write('  B - Backwards        U - Ignore upper/lowercase');
  307.   gotoxy(dr,13);  write('  G - Global           W - Whole words only');
  308.   gotoxy(dr,14);  write('  N - No questions     n - Number of occurences');
  309.   Wait;
  310. end;
  311.  
  312. procedure PrintType;
  313. begin
  314.   gotoxy(dr,2);   write('{ integer, real, boolean, char, string[xx] }');
  315.   gotoxy(dr,4);   write('TYPE');
  316.   gotoxy(dr,5);   write('  text80   = STRING[80];');
  317.   gotoxy(dr,6);   write('  letter   = ''a''..''z'';');
  318.   gotoxy(dr,7);   write('  tones    = 1..12;');
  319.   gotoxy(dr,8);   write('  row      = SET OF tones;');
  320.   gotoxy(dr,9);   write('  chtype   = char;');
  321.   gotoxy(dr,10);  write('  regtype  = record');
  322.   gotoxy(dr,11);  write('               ax,bx,cx,dx,bp,si,di,ds,es,flags:INTEGER');
  323.   gotoxy(dr,12);  write('             end;');
  324.   gotoxy(dr,13);  write('  day      = (monday,tuesday,wenesday,thursday,');
  325.   gotoxy(dr,14);  write('              friday,saturday,sunday);');
  326.   Wait;
  327. end;
  328.  
  329. procedure PrintConst;
  330. begin
  331.   gotoxy(dr,2);   write('{ stored in code_segment }');
  332.   gotoxy(dr,3);   write('{ integer, real, boolean, char, string[xx] }');
  333.   gotoxy(dr,5);   write('CONST');
  334.   gotoxy(dr,6);   write('  minus2     = -2;');
  335.   gotoxy(dr,7);   write('  pagesize   = 60;');
  336.   gotoxy(dr,8);   write('  pi         = 3.1415926535;');
  337.   gotoxy(dr,9);   write('  histring   = ''hello'';');
  338.   gotoxy(dr,10);  write('  valid      = TRUE;');
  339.   gotoxy(dr,11);  write('  msb : BYTE = 0;');
  340.   gotoxy(dr,12);  write('  lsb : BYTE = 0;');
  341.   Wait;
  342. end;
  343.  
  344. procedure PrintVar;
  345. begin
  346.   gotoxy(dr,2);   write('{ stored in data_segment }');
  347.   gotoxy(dr,3);   write('{ integer, real, boolean, char, string[xx] }');
  348.   gotoxy(dr,4);   write('VAR');
  349.   gotoxy(dr,5);   write('  count,index    : INTEGER;');
  350.   gotoxy(dr,6);   write('  result,value   : REAL;');
  351.   gotoxy(dr,7);   write('  eom,character  : CHAR;');
  352.   gotoxy(dr,8);   write('  line           : STRING[80];');
  353.   gotoxy(dr,9);   write('  error          : BOOLEAN;');
  354.   gotoxy(dr,10);  write('  inventory      : FILE OF invtype;');
  355.   gotoxy(dr,11);  write('  matrix         : ARRAY [1..50,1..50] OF INTEGER;');
  356.   gotoxy(dr,12);  write('  cmdlength      : BYTE ABSOLUTE CSEG:$0080;');
  357.   gotoxy(dr,13);  write('  cmdline        : STRING[127] ABSOLUTE CSEG:$0080;');
  358.   gotoxy(dr,14);  write('  intrip         : INTEGER ABSOLUTE $0000:$0040;');
  359.   Wait;
  360. end;
  361.  
  362. procedure PrintCase;
  363. begin
  364.   gotoxy(dr,2);   write('WITH record_identifier DO');
  365.   gotoxy(dr,3);   write('  statement(s);');
  366.   gotoxy(dr,6);   write('CASE expression OF');
  367.   gotoxy(dr,7);   write('  constant  :  statement(s);');
  368.   gotoxy(dr,8);   write('  constant  :  statement(s)');
  369.   gotoxy(dr,9);   write('ELSE');
  370.   gotoxy(dr,10);  write('  statement(s);');
  371.   gotoxy(dr,11);  write('  statement(s)');
  372.   gotoxy(dr,12);  write('END;');
  373.   Wait;
  374. end;
  375.  
  376. procedure RepeatWhile;
  377. begin
  378.   gotoxy(dr,4);   write('REPEAT');
  379.   gotoxy(dr,5);   write('  statement(s);');
  380.   gotoxy(dr,6);   write('  statement(s) ');
  381.   gotoxy(dr,7);   write('UNTIL condition;');
  382.   gotoxy(dr,10);  write('WHILE condition DO');
  383.   gotoxy(dr,11);  write('  statement(s);');
  384.   Wait;
  385. end;
  386.  
  387. procedure IfFor;
  388. begin
  389.   gotoxy(dr,2);   write('IF condition');
  390.   gotoxy(dr,3);   write('  THEN statement(s)');
  391.   gotoxy(dr,4);   write('  ELSE statement(s);');
  392.   gotoxy(dr,7);   write('FOR variable := expression1 TO expression2 DO');
  393.   gotoxy(dr,8);   write('  statement(s);');
  394.   gotoxy(dr,10);  write('                      or');
  395.   gotoxy(dr,12);  write('FOR variable := expression1 DOWNTO expression2 DO');
  396.   gotoxy(dr,13);  write('  statement(s);');
  397.   Wait;
  398. end;
  399.  
  400. procedure ProgProcFunc;
  401. begin
  402.   gotoxy(dr,4);   write('PROGRAM progname;');
  403.   gotoxy(dr,7);   write('PROCEDURE procname(VAR num1,num2 : INTEGER; ch : CHAR);');
  404.   gotoxy(dr,8);   write('PROCEDURE procname(str1 : STRING80; length : REAL);');
  405.   gotoxy(dr,11);  write('FUNCTION funcname(VAR value : REAL) : INTEGER;');
  406.   gotoxy(dr,12);  write('FUNCTION funcname(ch : CHAR; num : INTEGER) : STRING80;');
  407.   Wait;
  408. end;
  409.  
  410. procedure ProgramStructure;
  411. begin
  412.   gotoxy(dr,1);   write('PROGRAM programname;');
  413.   gotoxy(dr,2);   write('type');
  414.   gotoxy(dr,3);   write('  .....');
  415.   gotoxy(dr,4);   write('const');
  416.   gotoxy(dr,5);   write('  .....');
  417.   gotoxy(dr,6);   write('var');
  418.   gotoxy(dr,7);   write('  .....');
  419.   gotoxy(dr,8);   write('PROCEDURE procedurename(variable_list);');
  420.   gotoxy(dr,9);   write('  .....');
  421.   gotoxy(dr,10);  write('FUNCTION functionname(variable_list):type_identifier;');
  422.   gotoxy(dr,11);  write('  .....');
  423.   gotoxy(dr,12);  write('begin');
  424.   gotoxy(dr,13);  write('  .....');
  425.   gotoxy(dr,14);  write('end.');
  426.   Wait;
  427. end;
  428.  
  429. procedure InputOutput;
  430. begin
  431.   gotoxy(dr,1);   write('INPUT/OUTPUT PROCEDURES :');
  432.   gotoxy(dr,2);   write('  Read(var F:file of type;var v:type);');
  433.   gotoxy(dr,3);   write('  Read(var F:text;var I:Integer);');
  434.   gotoxy(dr,4);   write('  Read(var F:text;var R:Real);');
  435.   gotoxy(dr,5);   write('  Read(var F:text;var C:Char);');
  436.   gotoxy(dr,6);   write('  Read(var F:text;var S:string);');
  437.   gotoxy(dr,7);   write('  Readln(var F:text);');
  438.   gotoxy(dr,8);   write('  Write(var F:file of type;var v:type);');
  439.   gotoxy(dr,9);   write('  Write(var F:text;I:Integer);');
  440.   gotoxy(dr,10);  write('  Write(var F:text;R:Real);');
  441.   gotoxy(dr,11);  write('  Write(var F:text;B:Boolean);');
  442.   gotoxy(dr,12);  write('  Write(var F:text;C:Char);');
  443.   gotoxy(dr,13);  write('  Write(var F:text;S:string);');
  444.   gotoxy(dr,14);  write('  Writeln(var F:text);');
  445.   Wait;
  446. end;
  447.  
  448. procedure Arithmetic;
  449. begin
  450.   gotoxy(dr,2);    writeln('ARITHMETIC FUNCTIONS :');
  451.   gotoxy(dr,3);   write('  Abs(I:Integer):Integer;');
  452.   gotoxy(dr,4);   write('  Abs(R:Real):Real;');
  453.   gotoxy(dr,5);   write('  ArcTan(R:Real):Real;');
  454.   gotoxy(dr,6);   write('  Cos(R:Real):Real;');
  455.   gotoxy(dr,7);   write('  Exp(R:Real):Real;');
  456.   gotoxy(dr,8);   write('  Frac(R:Real):Real;');
  457.   gotoxy(dr,9);   write('  Int(R:Real):Real;');
  458.   gotoxy(dr,10);  write('  Ln(R:Real):Real;');
  459.   gotoxy(dr,11);  write('  Sin(R:Real):Real;');
  460.   gotoxy(dr,12);  write('  Sqr(I:Integer):Integer;');
  461.   gotoxy(dr,13);  write('  Sqr(R:Real):Real;');
  462.   gotoxy(dr,14);  write('  Sqrt(R:Real):Real;');
  463.   Wait;
  464. end;
  465.  
  466. procedure ScalarHeap;
  467. begin
  468.   gotoxy(dr,2);    writeln('SCALAR FUNCTIONS :');
  469.   gotoxy(dr,3);   write('  Odd(I:Integer):Boolean;');
  470.   gotoxy(dr,4);   write('  Pred(X:scalar):scalar;');
  471.   gotoxy(dr,5);   write('  Succ(X:scalar):scalar;');
  472.   gotoxy(dr,6);   write('HEAP CONTROL PROCEDURES :');
  473.   gotoxy(dr,7);   write('  GetMem(var P:pointer;I:Integer);');
  474.   gotoxy(dr,8);   write('  Mark(var P:pointer);');
  475.   gotoxy(dr,9);   write('  New(var P:pointer);');
  476.   gotoxy(dr,10);  write('  Release(var P:pointer);');
  477.   gotoxy(dr,11);  write('HEAP CONTROL FUNCTIONS :');
  478.   gotoxy(dr,12);  write('  MemAvail:Integer;');
  479.   gotoxy(dr,13);  write('  Ord(P:pointer):Integer;');
  480.   gotoxy(dr,14);  write('  Ptr(I:Integer):pointer;');
  481.   Wait;
  482. end;
  483.  
  484. procedure Strings;
  485. begin
  486.   gotoxy(dr,2);    writeln('STRING PROCEDURES :');
  487.   gotoxy(dr,3);   write('  Delete(var S:string;Pos,Len:Integer);');
  488.   gotoxy(dr,4);   write('  Insert(S:string;var D:string;Pos:Integer);');
  489.   gotoxy(dr,5);   write('  Str(I:Integer;var S:string);');
  490.   gotoxy(dr,6);   write('  Str(R:Real;var S:string);');
  491.   gotoxy(dr,7);   write('  Val(S:string;var R:Real;var p:Integer);');
  492.   gotoxy(dr,8);   write('  Val(S:string;var I,P:Integer);');
  493.   gotoxy(dr,9);   write('STRING FUNCTIONS :');
  494.   gotoxy(dr,10);  write('  Concat(S1,S2,...,Sn:string):string;');
  495.   gotoxy(dr,11);  write('  Copy(S:string;Pos,Len:Integer):string;');
  496.   gotoxy(dr,12);  write('  Length(S:string):Integer;');
  497.   gotoxy(dr,13);  write('  Pos(Pattern,Source:string):Integer;');
  498.   Wait;
  499. end;
  500.  
  501. procedure FileProc;
  502. begin
  503.   gotoxy(dr,2);    writeln('FILE PROCEDURES :');
  504.   gotoxy(dr,3);   write('  Assign(var F:file;name:string);');
  505.   gotoxy(dr,4);   write('  BlockRead(var F:file;var Dest:Type;Num:Integer);');
  506.   gotoxy(dr,5);   write('  BlockWrite(var F:file;var Dest:Type;Num:Integer);');
  507.   gotoxy(dr,6);   write('  Chain(var F:file);');
  508.   gotoxy(dr,7);   write('  Close(var F:file);');
  509.   gotoxy(dr,8);   write('  Erase(var F:file);');
  510.   gotoxy(dr,9);   write('  Execute(var F:file);');
  511.   gotoxy(dr,10);  write('  Rename(var F:file;Name:string);');
  512.   gotoxy(dr,11);  write('  Reset(var F:file);');
  513.   gotoxy(dr,12);  write('  Rewrite(var F:file);');
  514.   gotoxy(dr,13);  write('  Seek(var F:file of type;Pos:Integer);');
  515.   Wait;
  516. end;
  517.  
  518. procedure FileFunc;
  519. begin
  520.   gotoxy(dr,2);    writeln('FILE FUNCTIONS :');
  521.   gotoxy(dr,3);   write('  Eof(var F:file):Boolean;');
  522.   gotoxy(dr,4);   write('  Eoln(var F:Text):Boolean;');
  523.   gotoxy(dr,5);   write('  FilePos(var F:file of type):Integer;');
  524.   gotoxy(dr,6);   write('  FilePos(var F:file):Integer;');
  525.   gotoxy(dr,7);   write('  FileSize(var F:file of type):Integer;');
  526.   gotoxy(dr,8);   write('  FileSize(var F:file):Integer;');
  527.   Wait;
  528. end;
  529.  
  530. procedure TransferScreen;
  531. begin
  532.   gotoxy(dr,1);    writeln('TRANSFER FUNCTIONS :');
  533.   gotoxy(dr,2);   write('  Chr(I:Integer):Char;');
  534.   gotoxy(dr,3);   write('  Ord(X:scalar):Integer;');
  535.   gotoxy(dr,4);   write('  Round(R:Real):Integer;');
  536.   gotoxy(dr,5);   write('  Trunc(R:Real):Integer;');
  537.   gotoxy(dr,6);   write('SCREEN RELATED PROCEDURES :');
  538.   gotoxy(dr,7);   write('  CrtExit;');
  539.   gotoxy(dr,8);   write('  CrtInit;');
  540.   gotoxy(dr,9);   write('  ClrEol;');
  541.   gotoxy(dr,10);  write('  ClrScr;');
  542.   gotoxy(dr,11);  write('  DelLine;');
  543.   gotoxy(dr,12);  write('  GotoXY(X,Y:Integer);');
  544.   gotoxy(dr,13);  write('  InsLine;');
  545.   gotoxy(dr,14);  write('  LowVideo;');
  546.   gotoxy(dr,15);  write('  NormVideo;');
  547.   Wait;
  548. end;
  549.  
  550. procedure MiscProc;
  551. begin
  552.   gotoxy(dr,1);    writeln('MISCELLANEOUS PROCEDURES :');
  553.   gotoxy(dr,2);   write('  MsDos(Record) and ...');
  554.   gotoxy(dr,3);   write('  Intr(int #:Integer:Record) where Record is:');
  555.   gotoxy(dr,4);   write('    AX,BX,CX,DX,BP,SI,DI,DS,ES,FLAGS:integer;');
  556.   gotoxy(dr,5);   write('  Delay(mS:Integer);');
  557.   gotoxy(dr,6);   write('  FillChar(var dest;length:Integer;data:Char);');
  558.   gotoxy(dr,7);   write('  FillChar(var dest;length:Integer;data:Byte);');
  559.   gotoxy(dr,8);   write('  Halt;');
  560.   gotoxy(dr,9);   write('  Move(var source,dest;length:Integer);');
  561.   gotoxy(dr,10);  write('  Randomize;');
  562.   gotoxy(dr,11);  write('  Inline($CD/$10);');
  563.   gotoxy(dr,12);  write('MISCELLANEOUS FUNCTIONS Part I :');
  564.   gotoxy(dr,13);  write('  Addr(var variable):Integer;');
  565.   gotoxy(dr,14);  write('  Addr(<function identifier>):Integer;');
  566.   gotoxy(dr,15);  write('  Addr(<procedure identifier>):Integer;');
  567.   Wait;
  568. end;
  569.  
  570. procedure MiscFunc;
  571. begin
  572.   gotoxy(dr,1);    writeln('MISCELLANEOUS FUNCTIONS Part II :');
  573.   gotoxy(dr,2);   write('  I/O driver addresses: F-Function P-Procedure');
  574.   gotoxy(dr,3);   write('    ConStPtr  (F), ConInPtr  (F), ConOutPtr (P)');
  575.   gotoxy(dr,4);   write('    LstOutPtr (P), AuxOutPtr (P), AuxInPtr  (F)');
  576.   gotoxy(dr,5);   write('    UsrOutPtr (P), UsrInPtr  (F)');
  577.   gotoxy(dr,6);   write('  Hi(I:Integer):Integer;');
  578.   gotoxy(dr,7);   write('  IOresult:Boolean;');
  579.   gotoxy(dr,8);   write('  KeyPressed:Boolean;');
  580.   gotoxy(dr,9);   write('  Lo(I:Integer):Integer;');
  581.   gotoxy(dr,10);  write('  Random(Range:Integer):Integer;');
  582.   gotoxy(dr,11);  write('  Random:Real;');
  583.   gotoxy(dr,12);  write('  SizeOf(var variable):Integer;');
  584.   gotoxy(dr,13);  write('  SizeOf(<type identifier>):Integer;');
  585.   gotoxy(dr,14);  write('  Swap(I:Integer):Integer;');
  586.   gotoxy(dr,15);  write('  Upcase(Ch:Char):Char;');
  587.   Wait;
  588. end;
  589.  
  590. procedure PrintDirectives;
  591. begin
  592.   gotoxy(dr,1);    writeln('COMPILER DIRECTIVES :');
  593.   gotoxy(dr,2);   write('  B - I/O Mode Selection          [ default B+ ]');
  594.   gotoxy(dr,3);   write('  C - CNTL S and CNTL C           [ default C+ ]');
  595.   gotoxy(dr,4);   write('  I - I/O Error Handling          [ default I+ ]');
  596.   gotoxy(dr,5);   write('  I - Include Files               [ $I VARS.PAS]');
  597.   gotoxy(dr,6);   write('  R - Index Range Check           [ default R- ]');
  598.   gotoxy(dr,7);   write('  V - Var-parameter Type Checking [ default V+ ]');
  599.   gotoxy(dr,8);   write('  U - User Interrupt              [ default U- ]');
  600.   gotoxy(dr,9);   write('  K - Stack Checking              [ default K+ ]');
  601.   gotoxy(dr,10);  write('  G - Input File Buffer (redirect)[ default G0 ]');
  602.   gotoxy(dr,11);  write('  P - Output File Buffer    "     [ default P0 ]');
  603.   gotoxy(dr,12);  write('  D - Device checking             [ default D+ ]');
  604.   gotoxy(dr,13);  write('  F - # of Open Files             [ default F16]');
  605.   gotoxy(dr,14);  write('  K - Stack Checking              [ default K+ ]');
  606.   gotoxy(dr,15);  write('ex: {$I-} / {$B-,R+,V-} / (*$U+*) / $G512 / $P256');
  607.   Wait;
  608. end;
  609.  
  610. procedure RuntimeErrors;
  611. begin
  612.   gotoxy(dr,2);    writeln('RUN-TIME ERROR MESSAGES :');
  613.   gotoxy(dr,3);   write('  01  -  Floating point overflow.');
  614.   gotoxy(dr,4);   write('  02  -  Division by zero attempted.');
  615.   gotoxy(dr,5);   write('  03  -  Sqrt argument error.');
  616.   gotoxy(dr,6);   write('  04  -  Ln argument error.');
  617.   gotoxy(dr,7);   write('  10  -  String length error.');
  618.   gotoxy(dr,8);   write('  11  -  Invalid string index.');
  619.   gotoxy(dr,9);   write('  90  -  Index out of range.');
  620.   gotoxy(dr,10);  write('  91  -  Scalar or subrange out of range.');
  621.   gotoxy(dr,11);  write('  92  -  Out of integer range.');
  622.   gotoxy(dr,12);  write('  F0  -  Overlay not found.');
  623.   gotoxy(dr,13);  write('  FF  -  Heap/stack collision.');
  624.   Wait;
  625. end;
  626.  
  627. procedure IOErrors;
  628. begin
  629.   gotoxy(dr,1);    writeln('I/O ERROR MESSAGES :');
  630.   gotoxy(dr,2);   write('  01  -  File does not exist.');
  631.   gotoxy(dr,3);   write('  02  -  File not open for input.');
  632.   gotoxy(dr,4);   write('  03  -  File not open for output.');
  633.   gotoxy(dr,5);   write('  04  -  File not open.');
  634.   gotoxy(dr,6);   write('  10  -  Error in numeric format.');
  635.   gotoxy(dr,7);   write('  20  -  Operation not allowed on a logical device.');
  636.   gotoxy(dr,8);   write('  21  -  Not allowed in direct mode.');
  637.   gotoxy(dr,9);   write('  22  -  Assign to std files not allowed.');
  638.   gotoxy(dr,10);  write('  90  -  Record length mismatch.');
  639.   gotoxy(dr,11);  write('  91  -  Seek beyond end-of-file.');
  640.   gotoxy(dr,12);  write('  99  -  Unexpected end-of-file.');
  641.   gotoxy(dr,13);  write('  F0  -  Disk write error.');
  642.   gotoxy(dr,14);  write('  F1  -  Directory is full.  F2  -  file size overflow.');
  643.   gotoxy(dr,15);  write('  F3  -  Too may open files. FF  -  File disappeared.');
  644.   Wait;
  645. end;
  646.  
  647. procedure StdIdentifiers;
  648. begin
  649.   gotoxy(dr,2);    writeln('STANDARD IDENTIFIERS :');
  650.   gotoxy(dr,3);   write('  DSeg:Integer');
  651.   gotoxy(dr,4);   write('  CSeg:Integer');
  652.   gotoxy(dr,5);   write('  SSeg:Integer');
  653.   gotoxy(dr,6);   write('  Seg(Name):Integer');
  654.   gotoxy(dr,7);   write('  Addr(Name):pointer');
  655.   gotoxy(dr,8);   write('  Ofs(Name):Integer');
  656.   gotoxy(dr,9);   write('  Mem[segment:offset]');
  657.   gotoxy(dr,10);  write('  MemW[segment:offset]');
  658.   gotoxy(dr,11);  write('  Port[portnum]');
  659.   gotoxy(dr,12);  write('  PortW[portnum]');
  660.   gotoxy(dr,13);  write('  LongFilePos       LongFileSize');
  661.   gotoxy(dr,14);  write('  LongSeek          MsDos');
  662.   Wait;
  663. end;
  664.  
  665. procedure Version2I;
  666. begin
  667.   gotoxy(dr,2);    write('           VERSION 2 Part I ');
  668.   gotoxy(dr,3);    write('  Procedures Part I :');
  669.   gotoxy(dr,4);    write('    Dispose(var P:pointer);');
  670.   gotoxy(dr,5);    write('    Draw(X1,Y1,X2,Y2,Color:Integer);');
  671.   gotoxy(dr,6);    write('    FreeMem(var P:pointer,I:Integer);');
  672.   gotoxy(dr,7);    write('    GraphBackground(Color:Integer);');
  673.   gotoxy(dr,8);    write('    GraphColorMode;');
  674.   gotoxy(dr,9);    write('    GraphMode;');
  675.   gotoxy(dr,10);   write('    GraphWindow(X1,Y1,X2,Y2,Color:Integer);');
  676.   gotoxy(dr,11);   write('    HiRes;');
  677.   gotoxy(dr,12);   write('    HiResColor(Color:Integer);');
  678.   gotoxy(dr,13);   write('    NoSound;');
  679.   gotoxy(dr,14);   write('    Palette(Color:Integer);');
  680.   gotoxy(dr,16);   write('             Press any key for next screen . . .');
  681.   read(Kbd,Garbage);
  682.   ClrScr;
  683.   gotoxy(dr,2);   write('            VERSION 2 Part II');
  684.   gotoxy(dr,3);   write('  Procedures Part II :');
  685.   gotoxy(dr,4);   write('    Plot(X,Y,Color:Integer);');
  686.   gotoxy(dr,5);   write('    Sound(I:Integer);');
  687.   gotoxy(dr,6);   write('    TextBackground(Color:Integer);');
  688.   gotoxy(dr,7);   write('    TextColor(Color:Integer);');
  689.   gotoxy(dr,8);   write('    TextMode(Color:Integer);');
  690.   gotoxy(dr,9);   write('    Window(X1,Y1,X2,Y2,Color:Integer);');
  691.   gotoxy(dr,10);  write('  Functions :');
  692.   gotoxy(dr,11);  write('    MaxAvail:Integer;');
  693.   gotoxy(dr,12);  write('    WhereX:Integer;');
  694.   gotoxy(dr,13);  write('    WhereY:Integer;');
  695.   Wait;
  696. end;
  697.  
  698.  
  699.  
  700. procedure Version3I;
  701. begin
  702.   gotoxy(dr,2);   write('            VERSION 3');
  703.   gotoxy(dr,3);   write('Directory Procedures:');
  704.   gotoxy(dr,4);   write('  ChDir(Str);          MkDir(Str);');
  705.   gotoxy(dr,5);   write('  RmDir(Str);          GetDir(Drv,Str);');
  706.   gotoxy(dr,6);   write('  OvrPath(Path);       OvrDrive(Drv:int)');
  707.   gotoxy(dr,7);   write('    (Dr: 0=Default drive; 1=A:,2=B:,3=C:, etc.)');
  708.   gotoxy(dr,8);   write('TurtleGraphics: (Include GRAPH.P');
  709.   gotoxy(dr,9);   write('  Back(±Dist:int); Forward(±Dist:int); ClearScreen;');
  710.   gotoxy(dr,10);  write('  Heading function;  HideTurtle;   ShowTurtle;  Home;');
  711.   gotoxy(dr,11);  write('  Wrap;  NoWrap;  PenDown;  PenUp;  SetHeading(Angle);');
  712.   gotoxy(dr,12);  write('  SetPenColor(Color:int);  SetPosition(x,y);');
  713.   gotoxy(dr,13);  write('  TurnLeft(Angle:int);  TurnRight(Angle:int); Xcor and');
  714.   gotoxy(dr,14);  write('  Ycor functions:int;  TurtleWindow(X,Y,W,H);');
  715.   gotoxy(dr,15);  write('  TurtleThere:(Bool Function);  TurtleDelay(Ms:int);');
  716.   Wait;
  717. end;
  718.  
  719.  
  720.  
  721. { MAIN INTERUPT SERVICE PROCEDURES }
  722.  
  723.  
  724. procedure EditCommands;
  725. begin
  726.   repeat
  727.     PrintMenu(1);
  728.     case selection of
  729.       1 : CursorMoveI;
  730.       2 : CursorMoveII;
  731.       3 : InsertDelete;
  732.       4 : BlockCommands;
  733.       5 : MiscEditing;
  734.     end;
  735.     until selection = escape;
  736.     selection := 10;
  737. end;
  738.  
  739. procedure Syntax;
  740. begin
  741.   repeat
  742.     PrintMenu(2);
  743.     case selection of
  744.       1 : PrintType;
  745.       2 : PrintConst;
  746.       3 : PrintVar;
  747.       4 : PrintCase;
  748.       5 : RepeatWhile;
  749.       6 : IfFor;
  750.       7 : ProgProcFunc;
  751.       8 : ProgramStructure;
  752.     end;
  753.     until selection = escape;
  754.     selection := 10;
  755. end;
  756.  
  757. procedure ProcFunc;
  758. begin
  759.   repeat
  760.     PrintMenu(3);
  761.     case selection of
  762.       1 : InputOutput;
  763.       2 : Arithmetic;
  764.       3 : ScalarHeap;
  765.       4 : Strings;
  766.       5 : FileProc;
  767.       6 : FileFunc;
  768.       7 : TransferScreen;
  769.       8 : MiscProc;
  770.       9 : MiscFunc;
  771.     end;
  772.     until selection = escape;
  773.     selection := 10;
  774.  
  775. end;
  776.  
  777. procedure DOIT;
  778. begin
  779.   textcolor(7);
  780.   repeat
  781.     PrintMenu(0);
  782.     case selection of
  783.       1 : EditCommands;
  784.       2 : Syntax;
  785.       3 : ProcFunc;
  786.       4 : PrintDirectives;
  787.       5 : RuntimeErrors;
  788.       6 : IOErrors;
  789.       7 : StdIdentifiers;
  790.       8 : Version2I;
  791.       9 : Version3I;
  792.     end;
  793.   until selection = escape;
  794. end;
  795.  
  796.  
  797. procedure ProcessInt;                  { Start of interupt service }
  798. begin
  799. {when invoked, this procedure saves the registers into the structured constant
  800.  'REGS' and restores the ds from the previously saved integer constant 'saveds'}
  801.  
  802.     inline(
  803.     $53/                               {PUSH BX}
  804.     $BB/regs/                          {MOV BX,OFFSET REGS}
  805.     $2E/$89/$47/$00/                   {CS:MOV [BX]0,AX}
  806.     $58/                               {POP AX}
  807.     $2E/$89/$47/$02/                   {CS:MOV [BX]2,AX}
  808.     $2E/$89/$4F/$04/                   {CS:MOV [BX]4,CX}
  809.     $2E/$89/$57/$06/                   {CS:MOV [BX]6,DX}
  810.     $2E/$89/$6F/$08/                   {CS:MOV [BX]8,BP}
  811.     $2E/$89/$77/$0A/                   {CS:MOV [BX]A,SI}
  812.     $2E/$89/$7F/$0C/                   {CS:MOV [BX]C,DI}
  813.     $2E/$8C/$5F/$0E/                   {CS:MOV [BX]E,DS}
  814.     $2E/$8C/$47/$10/                   {CS:MOV [BX]10,ES}
  815.     $9C/                               {PUSHF}
  816.     $58/                               {POP AX}
  817.     $2E/$89/$47/$12/                   {CS:MOV [BX]12,AX}
  818.     $2E/$8E/$1E/saveds                 {CS:MOV DS,SAVEDS -- PUT PROPER DS}
  819.     );
  820.  
  821.   if halfreg.ah <> 0 then Intr(userint,regs) else
  822.   begin
  823.     Intr(userint,regs);
  824.     if (halfreg.ah = EntryChar) and (halfreg.al = $00) then
  825.     begin
  826.       savereg.ax := $0300;
  827.       savereg.bx := $0;
  828.       Intr($10,savereg);               { get cursor position }
  829.       cursorpos := savereg.dx;
  830.  
  831.       move(RealScreen,TempScreen,$1000);
  832.       OpenWindow;
  833.       ;                      { save text in window }
  834.       DOIT;
  835.       CloseWindow;                     { put back the text in the window }
  836.       move(TempScreen,RealScreen,$1000);
  837.  
  838.       savereg.ax := $0200;
  839.       savereg.bx := $0;
  840.       savereg.dx := cursorpos;
  841.       Intr($10,savereg);               { restore cursor position }
  842.  
  843.       halfreg.ah := 0;
  844.       Intr(userint,regs);
  845.     end;
  846.   end;
  847.  
  848. {when invoked this routine restores the registers from the structure constant}
  849.  
  850.     inline(
  851.     $BB/REGS/                          {MOV BX,OFFSET REGS}
  852.     $2E/$8E/$47/$10/                   {CS:MOV ES,[BX]10}
  853.     $2E/$8E/$5F/$0E/                   {CS:MOV DS,[BX]0E}
  854.     $2E/$8B/$7F/$0C/                   {CS:MOV DI,[BX]0C}
  855.     $2E/$8B/$77/$0A/                   {CS:MOV SI,[BX]0A}
  856.     $2E/$8B/$6F/$08/                   {CS:MOV BP,[BX]08}
  857.     $2E/$8B/$57/$06/                   {CS:MOV DX,[BX]06}
  858.     $2E/$8B/$4F/$04/                   {CS:MOV CX,[BX]04}
  859.     $2E/$8B/$47/$00/                   {CS:MOV AX,[BX]00}
  860.     $2E/$FF/$77/$12/                   {CS:PUSH [BX]12}
  861.     $9D/                               {POPF}
  862.     $2E/$8B/$5F/$02/                   {CS:MOV BX,[BX]02}
  863.     $5D/                               {POP BP}  {restore the stack pointer}
  864.     $5D                                {POP BP}
  865.     );
  866.  
  867.     inline ($CA/$02/$00)               {RETF 02}
  868.  
  869. end;
  870.  
  871.  
  872. { PROGRAM 'THELP' }                    { Program installation }
  873. begin
  874.   SaveDS := dseg;
  875.   SaveReg.ax := $3500 + UserInt;
  876.   Intr($21,SaveReg);                   { get user interupt }
  877.  
  878.   if SaveReg.es <> $00 then
  879.     writeln('User Interupt in use -- can''t install THELP.')
  880.   else
  881.  
  882.   begin
  883.     writeln('Installing THELP  --  Press < ALT "R" > to Recall help.');
  884.     writeln('                      Press   < ESC >   to  exit  help.');
  885.     savereg.ax := $3500 + KybdInt;
  886.     Intr($21,savereg);                 { get keyboard interupt }
  887.  
  888.     savereg.ax := $2500 + UserInt;
  889.     savereg.ds := savereg.es;
  890.     savereg.dx := savereg.bx;
  891.     Intr($21,savereg);                 { put in user interupt }
  892.  
  893.     savereg.ax := $2500 + KybdInt;
  894.     savereg.ds := cseg;
  895.     savereg.dx := ofs(ProcessInt);
  896.     Intr($21,savereg);                 { install our interupt processor }
  897.  
  898.     savereg.dx := ProgSize;
  899.     Intr($27,savereg);                 { terminate and stay resident }
  900.   end;
  901.   inline($CD/$20);                     { terminate if interupt in use }
  902. end.
  903.